﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using System.Xml;

namespace GameVLTK
{
    public class Killer : MoveableUnit
    {
        #region Thuộc Tính
        public override int HP
        {
            get{return base.HP;}
            set
            {
                base.HP = value;
                if (this.HP <= 0)
                {
                    this.IsVisible = false;

                    //Killer ở trạng thái chết,
                    Map.Killers.Killers.Remove(this);

                    // ?????????Không biết hủy vùng nhớ như thế nào??????????

                    //Xóa Unit trên MiniMap
                    Map.Dots.Remove(this.UnitDot);

                    //Sinh ra vật phẩm
                    int id = Global.rnd.Next() % Map.PrototypeProductions.Prototypes.Count;
                    Production pro = null;
                    pro = (Production)Map.PrototypeProductions.GetPrototypeById(id);
                    pro.TopLeft = this.TopLeft;
                    Map.ForeGround.Add(pro);

                    //Add vật phẩm được sinh ra để quản lý
                    Map.ProductionsManager.Productions.Add(pro);


                    Global.BroadCastEvents(Global.EVENTS.GM_KILLER_DIED, this, null, null);
     
                }
            }
        }
         
        
        
        #endregion

        public Killer(ContentManager content, string path, XmlNode nKiller, 
                         Vector2 topLeft):base(content, Map.Doc)
        {
            this.HP = 100;

            this.Sprites = new List<MySprite>();
            this.nSprites = nKiller.ChildNodes.Count;
            
            //Số frame theo mỗi hướng
            this.FrameOfThatDirs = new int[this.nSprites];

            Texture2D[] txttures = null;
            XmlNode nState = null;
            int nTextures = 0;
            string prefixState = null;
            MySprite mySprite = null;
            for (int i = 0; i < this.nSprites; i++)
            {
                nState = nKiller.ChildNodes[i];

                //Lấy tên của trạng thái của Killer
                prefixState = nState.Attributes["Prefix"].Value;

                //Số lượng texture
                nTextures = int.Parse(nState.Attributes["So_Luong"].Value);

                txttures = LoadTextures(content, path + prefixState + "/", nTextures, i);

                mySprite = new MySprite(txttures, this.TopLeft);
                mySprite.FrameSequence = CalcFrameSeq();
                this.Sprites.Add(mySprite);
            }

            //Tính kích thước Players
            this.Size = new Vector2(this.Sprites.ElementAt((int)Global.enmStates.DUNG_YEN).Textures[0].Width,
                                    this.Sprites.ElementAt((int)Global.enmStates.DUNG_YEN).Textures[0].Height);

            //Xác định vị trí Killer
            this.TopLeft = topLeft;

            //Qui định thứ tự vẽ trên Map
            this.Z_Index = (float)this.TopLeft.Y;

            //Khởi tạo Skill cho Killer
            this.Skills = new List<Skill>();
            this.Skills.Add((Skill)Map.PrototypeSkills.GetPrototypeById(
                   Global.rnd.Next(Map.PrototypeSkills.Prototypes.Count)));
            this.CurrentSkill = 0;
        }


        public override void Update(GameTime gameTime)
        {
            if (this.IsVisible)
            {

                //Update vị trí cho thành HealthBar
                this.HealthBar.HealthBarPosition = new Vector2(this.TopLeft.X + this.Size.X / 4,
                                                               this.TopLeft.Y - 5);

                this.HealthBar.HealthDotPosition = new Vector2(this.TopLeft.X + this.Size.X / 4 + 1,
                                                               this.TopLeft.Y - 4);


                //Update vị trí Dot trên Mini Map
                this.Logic = this.TopLeft - Global.TopLeft;
                this.UnitDot.DotLogic = new Vector2(this.Logic.X / Map.MiniMap.Scale,
                                      this.Logic.Y / Map.MiniMap.Scale);

                //Trường hợp nhân vật đang sử dụng Skill
                if (this.IsSkillActive)
                {
                    if (Skills[this.CurrentSkill].IsSkillActive)
                    {
                        this.Skills[this.CurrentSkill].Update(gameTime);
                    }
                    else
                    {
                        this.IsSkillActive = false;
                    }

                }


                if (this.CurrentState == (int)Global.enmStates.TAN_CONG)
                {
                    //Nếu nó đánh hết một đòn thì mới trừ máu con Killer xuống
                    if (Map.Player.HP > 0)
                    {
                        //Qui định khoảng thời gian để mất một giọt máu
                        this.TimeOld += gameTime.ElapsedGameTime.Milliseconds;
                        if (this.TimeOld > 500)
                        {
                            this.TimeOld = 0;
                            Map.Player.HP -= 1;

                            if (this.IsSkillActive == false)
                                Global.BroadCastEvents(Global.EVENTS.GM_KILLER_FIRED_SKILL, this, null, null);
                            
                        }
                    }
                }

                this.Sprites[this.CurrentState].Update(gameTime);
               
            }
            else
            {
                this.UnitDot.IsVisible = false;
            }
          
              
        }

        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            if (this.IsVisible)
             {
                    //Thanh HealBar cho Player
                    this.HealthBar.Draw(gameTime, spriteBatch);

                    //Vẽ Skill
                    if (this.IsSkillActive)
                    {
                        this.Skills[this.CurrentSkill].Draw(gameTime, spriteBatch);
                    }

                    this.Sprites[this.CurrentState].Draw(gameTime, spriteBatch);

                    //Vẽ tên nhân vật lên
                    Global.DrawName(spriteBatch, this.Name, 
                                 this.TopLeft, this.Size, Color.White);
             }
        }

        public override int OnEvent(Global.EVENTS eventID, object sender, object[] args)
        {
            int kq = 0;
            switch (eventID)
            {
                case Global.EVENTS.GM_KILLER_FIRED_SKILL:
                    {
                        if (sender == this)
                        {
                            this.IsSkillActive = true;

                            this.Skills[this.CurrentSkill].TopLeft = new Vector2(Map.Player.TopLeft.X - Map.Player.Size.X / 2,
                                                                     Map.Player.TopLeft.Y - Map.Player.Size.Y / 2);

                            //Kích hoạt skill
                            this.Skills[this.CurrentSkill].IsSkillActive = true;

                            Global.soundManager.playSound("Fired-Skill");
                            kq = 1;
                        }
                        break;
                    }
                case Global.EVENTS.GM_PLAYER_ATTACK_KILLER:
                    {
                        //Cập nhật lại trạng thái cho Killer
                        this.PrevState = this.CurrentState;
                        this.CurrentState = (int)Global.enmStates.TAN_CONG;

                        //Tính hướng tấn công cho Killer
                        Vector2 topLeft_PLayer = (Vector2)args[0];
                        this.PrevDirection = this.CurrentDirection;
                        this.CurrentDirection = CalDirection(topLeft_PLayer);


                        kq = 1;
                        break;
                    }
                case Global.EVENTS.GM_Killer_COLLISION_SKILL:
                    {
                        this.HP -= 3;
                        kq = 1;
                        break;
                    }
                case Global.EVENTS.GM_MAP_TOPLEFT_CHANGED:
                    {
                        this.TopLeft += (Vector2)args[0];
                        break;
                    }
                default:
                    break;
            }

            return kq;
        }

       

    }
}
